arduino 定时器、定时中断与PWM使用以及注意事项 您所在的位置:网站首页 arduino servo的用法 arduino 定时器、定时中断与PWM使用以及注意事项

arduino 定时器、定时中断与PWM使用以及注意事项

2023-07-14 11:20| 来源: 网络整理| 查看: 265

其他学习资料参考

一、Arduino定时器简介

Arduino UNO有三个定时器,分别是timer0,timer1和timer2。每个定时器都有一个计数器,在计时器的每个时钟周期递增。当计数器达到存储在比较匹配寄存器中指定值时触发CTC定时器中断。一旦定时器计数器达到该值,它将在定时器时钟的下一个定时器上清零(复位为零),然后它将继续再次计数到比较匹配值。通过选择比较匹配值并设置定时器递增计数器的速度,你可以控制定时器中断的频率。

下面引出UNO R3定时器各个寄存器的配置关系:

Timer0:PIN5和PIN6的PWM输出、delay()、millis()、delayMicroseconds()。 Timer1:PIN9和PIN10的PWM输出、舵机库Servo.h、TimerOne库、使用两个tone()变量时。 Timer2:PIN3和PIN11的PWM输出、无源蜂鸣器的tone()、红外库IRremote.h默认使用Timer2,可以通过修改库文件使用Timer1.

二、定时器基本概念

1、预分频系数与比较匹配器

Arduino UNO时钟以16MHz运行。计数器的一个刻度值表示1 / 16,000,000秒(~63ns),跑完1s需要计数值16,000,000。

a、Timer0和timer2是8位定时器,可以存储最大计数器值255。

b、Timer1是一个16位定时器,可以存储最大计数器值65535。

一旦计数器达到其最大值,它将回到零(这称为溢出)。因此,需要对时钟频率进行分频处理,即预分频器。通过预分频器控制定时计数器的增量速度。预分频器与定时器的计数速度如下:

定时器速度(HZ) = Arduino UNO时钟速度(16MHz) / 预分频器系数

因此,1预分频器将以16MHz递增计数器,8预分频器将在2MHz递增,64预分频器= 250kHz,依此类推。

三个定时器的预分频系数配置如表:

现在您可以用以下公式计算中断频率:

中断频率(Hz)=(Arduino时钟速度16MHz)/(预分频器*(比较匹配寄存器+ 1))

重新排列上面的等式,给出你想要的中断频率,你可以求解比较匹配寄存器值:

比较匹配寄存器= [16,000,000Hz /(预分频器*所需的中断频率)] - 1

记住,当你使用定时器0和2时,这个数字必须小于256,对于timer1小于65536。

所以如果你想每秒一次中断(频率为1Hz):

比较匹配寄存器= [16,000,000 /(预分频器 * 1)] -1

预分频器为1024,你得到:

比较匹配寄存器= [16,000,000 /(1024 * 1)] -1 = 15,624

因为256 // timer0中断2Hz切换引脚13(LED) //产生频率为10kHz / 2 = 5kHz的脉冲波 if(toggle0){ digitalWrite(8,HIGH); toggle0 = 0; } else{ digitalWrite(8,LOW); toggle0 = 1; } } ISR(TIMER1_COMPA_vect){// timer1中断2Hz切换引脚13(LED) //产生频率为2Hz / 2 = 1Hz的脉冲波 if(toggle1>=500) digitalWrite(13,HIGH); if(toggle1= 1000) toggle1 = 0; } ISR(TIMER2_COMPA_vect){// timer2中断8kHz切换引脚9 //产生频率为8kHz / 2 = 4kHz的脉冲波 if(toggle2){ digitalWrite(9,HIGH); toggle2 = 0; } else{ digitalWrite(9,LOW); toggle2 = 1; } } //loop function void loop(){ } 四、改变pwm频率至特定频率几种方法

可在setup中添加以下代码,请注意不同型号板子对应代码不同,尽量不要改变定时器0,会影响delay等使用:

// For Arduino Uno, Nano, Micro Magician, Mini Driver, Lilly Pad and any other board using ATmega 8, 168 or 328** //---------------------------------------------- Set PWM frequency for D5 & D6 ------------------------------- //TCCR0B = TCCR0B & B11111000 | B00000001; // set timer 0 divisor to 1 for PWM frequency of 62500.00 Hz //TCCR0B = TCCR0B & B11111000 | B00000010; // set timer 0 divisor to 8 for PWM frequency of 7812.50 Hz TCCR0B = TCCR0B & B11111000 | B00000011; // set timer 0 divisor to 64 for PWM frequency of 976.56 Hz (The DEFAULT) //TCCR0B = TCCR0B & B11111000 | B00000100; // set timer 0 divisor to 256 for PWM frequency of 244.14 Hz //TCCR0B = TCCR0B & B11111000 | B00000101; // set timer 0 divisor to 1024 for PWM frequency of 61.04 Hz //---------------------------------------------- Set PWM frequency for D9 & D10 ------------------------------ //TCCR1B = TCCR1B & B11111000 | B00000001; // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz //TCCR1B = TCCR1B & B11111000 | B00000010; // set timer 1 divisor to 8 for PWM frequency of 3921.16 Hz TCCR1B = TCCR1B & B11111000 | B00000011; // set timer 1 divisor to 64 for PWM frequency of 490.20 Hz (The DEFAULT) //TCCR1B = TCCR1B & B11111000 | B00000100; // set timer 1 divisor to 256 for PWM frequency of 122.55 Hz //TCCR1B = TCCR1B & B11111000 | B00000101; // set timer 1 divisor to 1024 for PWM frequency of 30.64 Hz //---------------------------------------------- Set PWM frequency for D3 & D11 ------------------------------ //TCCR2B = TCCR2B & B11111000 | B00000001; // set timer 2 divisor to 1 for PWM frequency of 31372.55 Hz //TCCR2B = TCCR2B & B11111000 | B00000010; // set timer 2 divisor to 8 for PWM frequency of 3921.16 Hz //TCCR2B = TCCR2B & B11111000 | B00000011; // set timer 2 divisor to 32 for PWM frequency of 980.39 Hz TCCR2B = TCCR2B & B11111000 | B00000100; // set timer 2 divisor to 64 for PWM frequency of 490.20 Hz (The DEFAULT) //TCCR2B = TCCR2B & B11111000 | B00000101; // set timer 2 divisor to 128 for PWM frequency of 245.10 Hz //TCCR2B = TCCR2B & B11111000 | B00000110; // set timer 2 divisor to 256 for PWM frequency of 122.55 Hz //TCCR2B = TCCR2B & B11111000 | B00000111; // set timer 2 divisor to 1024 for PWM frequency of 30.64 Hz //For Arduino Mega1280, Mega2560, MegaADK, Spider or any other board using ATmega1280 or ATmega2560** //---------------------------------------------- Set PWM frequency for D4 & D13 ------------------------------ //TCCR0B = TCCR0B & B11111000 | B00000001; // set timer 0 divisor to 1 for PWM frequency of 62500.00 Hz //TCCR0B = TCCR0B & B11111000 | B00000010; // set timer 0 divisor to 8 for PWM frequency of 7812.50 Hz TCCR0B = TCCR0B & B11111000 | B00000011;


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有